C++ 的指针的指针(如int **)和二维数组的关系

您所在的位置:网站首页 int* p与int *p C++ 的指针的指针(如int **)和二维数组的关系

C++ 的指针的指针(如int **)和二维数组的关系

2024-07-17 03:46| 来源: 网络整理| 查看: 265

首先可以理解,一维数组的数组名可以等效为指向数组首元素地址的指针,而且是一个特殊的,记录了数据类型大小的指针。因此,当int p[10]时,我们才可以用*(p+i)来等效p[i]。如果没有记录数据类型大小,即便知道首元素的地址,也无法得知(p+i)究竟指向p后面多少乘以i个字节。 同时,二维数组实际上可以等效为一个超大的“一维数组”(这不是废话么…连内存都是这样等效的),只不过是一个特殊的,记录了列数信息,自动可以计算索引的“一维数组”。所以,int a[10][10]的a可以理解为指向int类型数组的首元素地址的指针,只不过带有列数信息而已。 而int *b[10]的b是一个指向int *的指针,也即指向指针的指针(b[i]是int *类型,b是int **类型)。如果b[i]关联上元素类型为int的数组,此时b也可以用来表示一个二维数组。表面上看,a,b都能(依靠一些符号)表示一个二维数组,但它们本质是完全不同的。严格来说,用int **表示的二维数组不是我们默认理解的,像int a[10][10]一样的“矩形的”二维数组。因为用int **表示的二维数组的不同行完全可以可以有不同的“列数”。 实例见下:

int m = 10, n = 20; int **a; // a是指向指针的指针类型(a:int **) int *b[10]; // b是的一维数组的数组名(指向首元素的指针) // 数组元素类型为指向int的指针(首元素是指针) // b是指向指针的指针类型(b:int **) int *c = new int[n]; // c是int *类型 b[8] = c; // 无语法报错 a = b; // 无语法报错

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3